Possiamo considerare un array come una "megavariabile", capace di contenere al suo interno un nemero definito di valori, al contrario delle variabili scalari le quali sono associate in modo univoco ad un solo valore. Gli array sono quindi dei contenitori multidimensionali capaci di contenere un gran volume di informazioni, pronte e disponibili in ogni momento. Essendo indicizzati gli array necessitano di cicli for..next per l'estrazione delle informazioni in essi stipati.
Chi produce siti web a livello professionale si è sicuramente scontrato con
form con un elevato numero di controlli, pensiamo ad esempi a form di contatto o
registrazione che possono avere anche oltre 20-25 controlli al loro interno.
Gestire 20-25 controlli (text, radio, checkbox, select, ecc..) ed i valori
ad essi associati non è del tutto semplice soprattuto quando diventa necessario
applicare routine di validazione server/side più o meno complesse sui singoli
campi del form e magari in seguito spedire il contenuto del form ad un database
o ad un component come CDONTS per spedire un email.
Poniamo il caso che il nostro cliente compili un form di questa complessità,
fatto questo invii il form ad una pagina ASP che processa i campi del form, li
valida e in caso di errore ri-posta i valori al form iniziale per la correzione
degli stessi.
Tornando al form iniziale il cliente troverebbe il messaggio di
errore, ma, purtroppo, anche i campi vuoti là dove le risposte erano corrette.
Al poveretto non rimane che ricompilare il form daccapo e con pazienza rinviare
il tutto.
Per evitare cose di questo genere provate a dare una occhiata allo
scripts ASP qui sotto.
Per comodità ho disegnato due pagine ASP, la prima contiene
una utile Funzione in VBS che si occupa di recuperare i valori contenuti
nell'array che abbiamo definito nella testata
della stessa pagina, ed inoltre il codice HTML del
form vero e proprio che dobbiamo compilare.
Analizzando nel dettaglio il
codice vediamo che se l'array non è pieno, cioè nel caso in cui accediamo per la
prima volta alla pagina del form, i campi del form si presenteranno vuoti e
quindi dovranno essere compilati dall'utente.
Una volta compilato, l'utente
invia il contenuto del form alla seconda pagina
ASP, la quale contiene il codice ASP per riempire l'arrayform con i valori
dei controlli.
Qui viene ridimensionato e riempito (attraverso un ciclo
for..next) un array bidimensionale contenente le coppie "nome del controllo /
valore del controllo della form", i suddetti valori si ottengono svuotando il
Request.Form del suo contenuto attraverso un ciclo for..next.
Una volta fatto
questo ridimensiono l'array alle giuste dimensioni, e ne metto il contenuto in
una session variable per poterlo passare da una pagina ASP
all'altra.
Nell'ultima parte di codice della seconda pagina possiamo vedere a
video il contenuto dell'array appena creato e ridimensionato.
La cosa si fa
nteressante se premiamo il tasto back del nostro browser, difatti ci apparirà il
nostro form ma con i campi riempiti dai valori precedentemente immessi. Proviamo
a cambiare alcuni valori e rinviamo il form, ripetiamo l'operazione di prima
(tasto back) e vedremo il form con i nuovi valori.
A prima vista forse non si capisce bene la comodità nell'utilizzo dell'array per la gestione dei form, ma vediamo qualche dettaglio:
Prima Pagina ASP
Function RecuperaValArray(NomeControlloForm, ValoreAssociato)<HTML>
<%
'recupero il nome della
pagina corrente
NomePagina =
Request.ServerVariables("SCRIPT_NAME")
NomePagina = Mid(NomePagina,
InstrRev(NomePagina, "/") + 1)
'recupero l'array dalla
variabile session, se esiste ovviamente...
arrayForm =
Session(NomePagina) [TOP]
On
Error Resume Next
'cerco il numero di valori contenuti
nell'array
intValoreArry = UBound(arrayForm, 2)
'se la funzione Ubound() non mi genera errori
If
Err.Number <> 0 Then Exit Function
'comincio a
leggere l'array per
'recuperare i valori dei
controlli della precedente sessione
For intLoop = 0 To
intValoreArry
'guardo se il nome del controllo è presente
nell'array
If LCase(arrayForm(0, intLoop)) =
LCase(NomeControlloForm) Then
'se c'è valuto la
possibilità che il valore ad esso
'associato sia
quello di una checkbox o un bottone di opzione, ad esempio
If
ValoreAssociato <> "" Then
'se è così setto il valore
appropriato
If LCase(ValoreAssociato) = LCase(arrayForm(1,
intLoop)) Then
RecuperaValArray = "CHECKED"
Else
RecuperaValArray = ""
End If
Else
'se invece il valore è una
stringa
RecuperaValArray = arrayForm(1,
intLoop)
End If
Exit Function
End If
Next
End Function
<HEAD>
<TITLE>Form per
per la dimostrazione dell'uso degli
array</TITLE>
</HEAD>
<BODY><FONT
FACE="Tahoma,Arial,sans-serif" SIZE="2">
<FORM
ACTION="array1.asp" METHOD="POST">[TOP]
TuoNome:
<INPUT TYPE="TEXT" NAME="TuoNome" VALUE="<% = RecuperaValArray("TuoNome",
"") %>"> <BR>
TuoCognome: <INPUT TYPE="TEXT" NAME="TuoCognome"
VALUE="<% = RecuperaValArray("TuoCognome", "") %>"> <P>
Cosa
ti piace mangiare ?
<INPUT TYPE="CHECKBOX" NAME="Pastasciutta" <% =
RecuperaValArray("Pastasciutta", "on") %>> Pastasciutta
<INPUT TYPE="CHECKBOX" NAME="Lasagne" <% =
RecuperaValArray("Lasagne", "on") %>> Lasagne
<INPUT
TYPE="CHECKBOX" NAME="Brodino" <% = RecuperaValArray("Brodino", "on")
%>> Brodino
<P>
CantantiPreferiti: <INPUT TYPE="TEXT"
NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(1)",
"") %>"> <BR>
CantantiPreferiti: <INPUT TYPE="TEXT"
NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(2)",
"") %>"> <BR>
CantantiPreferiti: <INPUT TYPE="TEXT"
NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(3)",
"") %>"> <P>
Vivo in:
<INPUT TYPE="RADIO"
NAME="Paese" VALUE="Italia" <% = RecuperaValArray("Paese", "Italia")
%>> Italia
<INPUT TYPE="RADIO" NAME="Paese" VALUE="Europa"
<% = RecuperaValArray("Paese", "Europa") %>> Europa
<INPUT
TYPE="RADIO" NAME="Paese" VALUE="Altrove" <% = RecuperaValArray("Paese",
"Altrove") %>> Altrove <P>
<INPUT TYPE="SUBMIT"
VALUE="Submit">
<INPUT TYPE="RESET" VALUE="Reset">
</FORM></FONT>
</BODY>
</HTML>
Seconda Pagina ASP
<HTML>
<HEAD>
<TITLE>Immagazzinare i valori di un
Form in un
Array</TITLE>
</HEAD>
<BODY>
<%
'creiamo un array bidimensionale, un po abbondante visto
' che
non conosco il numero di controlli del form
ReDim arrayForm(1,
255)
intIndice = 0
'andiamo a "loppare" Request.Form per
ricevere tutte le informazioni contenute
For Each varItem in
Request.Form
If Request.Form(varItem).count > 1 Then
'se il numero di controlli del form e maggiore di uno
For
intLoop = 1 to Request.Form(varItem).count
'immagazzino
nell'array le coppie nome-controllo/valore-controllo
arrayForm(0,
intIndice) = varItem & "(" & intLoop & ")"
arrayForm(1,
intIndice) = Request.Form(varItem)(intLoop)
intIndice = intIndice +
1
Next
Else
'nel caso sia presente un singolo valore
nell'oggetto Request.Form invece:
arrayForm(0, intIndice) =
varItem
arrayForm(1, intIndice) = Request.Form(varItem)
intIndice =
intIndice + 1
End If
Next
'ridimensiono l'array
alle giuste dimensioni, dato che ora
' conosco il
numero di controlli del form
ReDim Preserve arrayForm(1, intIndice -
1)
'Ricevo il nome dalla variabile session
'attraverso questo script
NomePaginaPrec
= Request.ServerVariables("HTTP_REFERER")
NomePaginaPrec =
Mid(NomePaginaPrec, InstrRev(NomePaginaPrec, "/") + 1)
'salvo l'array nella Sessione
Session(NomePaginaPrec) =
arrayForm
Response.Write "<BR><h2>---- Valori Ricevuti dal
Form ed immagazzinati dall'Array----</h2><BR>"
'MOSTRO A VIDEO IL CONTENUTO DELL'ARRAY
For intIndice = 0
To UBound(arrayForm, 2)
Response.Write arrayForm(0, intIndice) & " = "
_
& arrayForm(1, intIndice) &
"<BR>"
Next
%>
</BODY>
</HTML>
Questi sono solo alcuni dei vantaggi ottenibili dall'uso degli array, in seguito scrivero altri articoli per mostrare la validazione applicata alle form con array, la gestione dei valori del form all'interno di un database e la creazione via CDONTS di un report email personalizzato che sfrutti i valori contenuti nell'array.
Ed anche per questa volta è tutto. Buona programmazione!